블로그
카테고리 이동
먼저 본 글은 2022년에 출시된 에릭 르완슨의 [금융 파이썬 쿡북]에 기반하고 있음을 알린다.
일반적으로 우리가 증권사 HTS나 MTS에서 보는 금융상품 그래프와 수익률은 모두 '일반 차트' 와 '단순 수익률' 이다.
그런데 이 주식 일반 차트 와 단순 수익률 에는 큰 함정이 있다. 실제 가치나 수익이 왜곡되어 보인다는 것이다.
예를 들어 아래의 그림을 보자.
코스피 일반 차트와 로그 차트 (출처: 중앙일보)
왼쪽의 코스피 일반 차트를 보자면
차트 제일 왼쪽 1986년 1월 ~1988년 12월까지의 수익보다 차트 제일 오른쪽 2020년 2월 ~ 2021년 6월까지의 수익이 더 커보인다.
하지만 아니다.
1986년 1월에 100만원을 투자했다면 1988년 12월에는 약 1,200만원이 되었을 것이다.
2020년 2월에 100만원을 투자했다면 2021년 6월에는 약 200만원이 되었을 것이다.
즉, 단순 수익률 을 보여주는 일반 차트 는 실제 수익을 왜곡시키는 효과를 가져오는 것이다.
그래서 쓰는 것이 '로그 수익률' 과 '로그 차트' 이다.
단순 수익률 R t는
$\combi{R}_t\ =\ \frac{\left(P_t-\combi{P}_{t-1}\right)}{\combi{P}_{t-1}}=\frac{\combi{P}_t}{\combi{P}_{t-1}}-1$ R t \= (P t − P t − 1 ) P t − 1 \= P t P t − 1 − 1
로그 수익률 rt 는
$\combi{r}_t=\log \left(\frac{\combi{P}_t}{\combi{P}_{t-1}}\right)=\log \left(\combi{P}_t\right)-\log \left(\combi{p}_{t-1}\right)$ r t \= l o g (P t P t − 1 ) \= l o g (P t ) − l o g (p t − 1 )
로 나타내어진다.
이렇게 로그 수익률 산식 을 적용하여 아까의 코스피 일반차트 를 '로그 차트 '로 바꾼 것이 위의 '코스피 로그 차트' 가 되겠다.
로그 차트 로 보면 옛날의 수익률과 수익에 비해서 최근의 등락은 귀여워 보인다.
(옛날 주식 트레이더들은 모두 야수의 심장을 가졌나...)
이렇게 로그 수익률 은 시간에 따라 왜곡되어 보일 수 있는 수익 혹은 손해를 바로 표현할 수 있게 해준다.
그런 로그 수익률 을 파이썬 으로 계산해보자
주식 단순 수익률과 로그 수익률을 파이썬으로 표현하기
위의 로그 수익률 식이 간단한 것처럼 많은 코딩이 필요하지 않다.
1. 시간과 조정종가만을 남길 때, 시간에 ' tz_localize(None) ' 처리를 할 필요가 있다.
→ tz_localize(None) 은 날짜 데이터에서 날짜만 남기고 시간을 지우는 메서드
→ 추후에 시간이 없고 날짜만 가진 데이터와 형식을 맞추기 위함
2. 단순 수익률 은 dataframe 의 pct_change() 를 사용해서 쉽게 계산할 수 있다.
→ pct_change() 는 현재와 이전 원소 사이의 백분율 변화를 계산한다.
3. 로그 수익률 은 shift(1) 을 적용한 데이터를 적용하지 않은 데이터로 나눈 채로 로그에 넣어버림으로서 계산할 수 있다.
→ shift(1) 을 쓰면 각 요소의 지연값을 불러온다.
아까 tz_localize() 를 적용하지 않은 데이터로 이후에 인플레이션 데이터를 합하여 가공하고자 하면
' Cannot join tz-naive with tz-aware DatatimeIndex' 라는 오류 메시지 가 뜬다.
시간이 있는 날짜 데이터와 시간이 없는 날짜 데이터를 합하고자 하니 발생하는 오류인 것이다.
이런 문제를 방지하기 위해 시간이 있는 날짜 데이터에 tz_localize() 를 적용하고 가공을 해야한다.
인플레이션 지수를 고려한 수익률을 계산하기
트레이딩 수익률이 50%이더라도 인플레이션 지수가 60%이면 아무 소용이 없다.
정말 진퉁 수익률을 구하고자 한다면 인플레이션 지수 도 수익률에 고려해보아야할 필요가 있다.
인플레이션 고려 수익율 은 아래의 수식으로 구할 수 있다. πt는 인플레이션 지수이다.
그리고 이 인플레이션율 혹은 인플레이션 지수 는 퀀들 quandl 에서 받을 수 있다.
인플레이션 지수 를 고려한 수익률은 아래의 코딩으로 구할 수 있다.
1. dataframe join 을 할 때 how = left 로서 왼쪽 join을 하면, 행별로 날짜 데이터가 일치할 경우 join이 되고, 그렇지 않을 경우 비워둔다고 한다.
2. 월별 주가로 가공하여 인플레이션 지수와 맞추기 위해, asfreq('M')으로 월 종가 데이터를 남긴다.
3. 인플레이션 데이터로 cpi를 가져오며
quandl.get(dataset = 'RATEINF/CPI_USA', start_date = "시작 날짜", close_date = "끝 날짜")
로 받을 수 있다.
이제 더이상 로그 수익률 등 주가 데이터를 가공하려고 구글 스프레드시트나 엑셀을 사용할 필요가 없다.
파이썬 으로 가능하다는 것을 알 수 있었다.